package com.ethan.protostuff;

import com.dyuproject.protostuff.LinkedBuffer;
import com.dyuproject.protostuff.ProtostuffIOUtil;
import com.dyuproject.protostuff.runtime.RuntimeSchema;

/**
 * @author ethan
 * create 2018-06-13 上午11:58
 * desc
 **/
public class SerializationUtil {

    /**
     * 序列化方法，将对象序列化为字节数组  对象->字节数组
     * @param obj
     * @param <T>
     * @return
     */
    @SuppressWarnings("unchecked")
    public static <T> byte[] serialize(T obj){
        //获取泛型对象的类型
        Class<T> tClass = (Class<T>) obj.getClass();
        //创建泛型对象的schema对象
        RuntimeSchema<T> schema = RuntimeSchema.createFrom(tClass);
        //创建LinkedBuffer对象
        LinkedBuffer buffer = LinkedBuffer.allocate(LinkedBuffer.DEFAULT_BUFFER_SIZE);
        //序列化
        byte[] array = ProtostuffIOUtil.toByteArray(obj,schema,buffer);
        return array;
    }


    /**
     * 反序列化方法，将字节数组泛序列化为对象（字节数组->对象）
     * @param data
     * @param tClass
     * @param <T>
     * @return
     */
    public static <T> T deserialize(byte[] data,Class<T> tClass){
        //创建泛型对象的schema对象
        RuntimeSchema<T> schema = RuntimeSchema.createFrom(tClass);
        //根据schema实例化对象
        T message = schema.newMessage();
        ProtostuffIOUtil.mergeFrom(data,message,schema);
        //返回序列化对象
        return message;
    }



}
